关于C#:缓冲区溢出漏洞利用更改函数调用 您所在的位置:网站首页 gdb 函数指针 关于C#:缓冲区溢出漏洞利用更改函数调用

关于C#:缓冲区溢出漏洞利用更改函数调用

2023-04-26 15:45| 来源: 网络整理| 查看: 265

我正在尝试执行缓冲区溢出,以将调用从功能A更改为功能B。这可行吗?我知道在控制返回指针之前,我必须弄清楚必须输入多少个字节,并弄清楚函数B的地址。是否可以更改它,以便在" x == 10 "之后我们注入函数B的地址而不是函数A? 编辑: 是否有可能在调用fillbuff之后,而不是返回到main,而是将其发送到函数B? 任何提示表示赞赏。

123456789101112131415161718192021222324int fillBuff(int x){     char buff[15];     puts("Enter your name");     gets(buff);     return(x + 5); } void functionA(){     puts("I dont want to be here");     exit(0); } void functionB(){     printf("I made it!");     exit(0); } int main(){     int x;     x = fillbuff(5);     if (x == 10){         functionA();     } } 相关讨论 顺便说一下,如果没有参数声明函数,则应在函数的参数括号中放置void。将它们留空并不意味着没有参数。 看到这个答案:stackoverflow.com/a/27214515/3846218

此处是显示如何执行此操作的文章:http://insecure.org/stf/smashstack.html。

像这样编译您的程序:gcc -g -c program.c(使用-g) 并运行gdb ./a.out。之后,运行命令disas main。您应该看到代码的反汇编及其在内存中的组织方式。您可以将main函数替换为任何其他函数,并查看其代码。 有关反汇编的更多信息,请参见:https://sourceware.org/gdb/onlinedocs/gdb/Machine-Code.html

运行GDB并分解计算机上的功能,functionA()的地址为0x400679,functionB()的地址为40068a。如果您看到主函数的反汇编代码,则有一个对地址0x400679的调用,您想要将其更改为40068a。 基本上,您必须使函数fillBuff中的缓冲区溢出,并且在到达指针的空间后,必须填充地址。本文显示了如何执行此操作。

相关讨论 如果要使用调试器,则ollydbg / EDB(取决于您的操作系统)会更适合此类情况,因为它们的GUI可以显示寄存器和内存值,并在更改这些值时突出显示。如果您只是打算使用GDB来转储程序集而不是逐步执行它,那么它实际上并不重要。 是的,DDD(gnu.org/software/ddd)是命令行GDB调试器的前端。 谢谢你。这非常有帮助

缓冲区溢出是C中未定义的行为。保证缓冲区溢出时不会发生任何事情,据我所知,该语言不需要局部变量和/或存储的返回地址的特定内存布局。除此之外,某些编译器会插入堆栈保护程序以使缓冲区溢出攻击更加困难。

如果要定义行为,则需要查看生成的程序集,并弄清楚缓冲区溢出将要做什么。根据生成的程序集,您可以确定堆栈布局和地址布局,并尝试使用其他函数的地址覆盖返回地址。

如果使用的是GCC,则打印出程序集的命令行选项为-Wa,-al。如果需要Intel语法,请添加-masm=intel。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有